package br.com.roboandar.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import br.com.roboandar.core.Estado;
import br.com.roboandar.core.Tipo;

/**
 * Servlet implementation class IniciaRobo
 */
public class IniciaRobo extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public IniciaRobo() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<Integer> posicoes = execute(request);
		
		PrintWriter pw = response.getWriter();
		JSONArray array = new JSONArray();
		for (Integer integer : posicoes) {
			JSONObject obj = new JSONObject();
			try {
				obj.put("posicao", String.valueOf(integer));
			} catch (JSONException e) {
				e.printStackTrace();
			}
			array.put(obj);
		}
		
		pw.print(array);
		pw.flush();
		
	}
	
	public List<Integer> execute(HttpServletRequest request){
		Integer posicao = Integer.parseInt(request.getParameter("posicoes"));
		return melhorCaminho(posicao, getMundoSession(request));
	}
	
	public List<Integer> melhorCaminho(Integer posicaoAgente,
			HashMap<Integer, Estado> mundo) {
		List<Integer> caminho = new ArrayList<Integer>();
		Estado estadoAtual = mundo.get(posicaoAgente);
		int corte = 0;

		while (estadoAtual.getTipo() != Tipo.Terminal
				&& estadoAtual.getTipo() != Tipo.Morte && corte <= 25) {

			double melhor = Double.MIN_VALUE;
			Estado estadoMelhor = null;

			for (Estado estadoVizinho : estadoAtual.getVizinhos()) {
				if (estadoVizinho.getTipo() != Tipo.Parede
						&& estadoVizinho.getRecompensa() > melhor) {
					melhor = estadoVizinho.getRecompensa();
					estadoMelhor = estadoVizinho;
				}
			}

			caminho.add(estadoMelhor.getPosicao());
			estadoAtual = estadoMelhor;
			corte++;
		}

		return caminho;
	}
	
	public HashMap<Integer,Estado> getMundoSession(HttpServletRequest request){
		HashMap<Integer,Estado> mundo = (HashMap<Integer,Estado>)request.getSession().getAttribute("MUNDO");
		return mundo;
	}

}
